#include <stdio.h>
#include <gmp.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>

int main(int argc, char **argv) {
  mpz_t sum;
  mpz_t fibn_2, fibn_1;
  mpz_t fibn;

  mpz_init(sum);
  mpz_init(fibn_1);
  mpz_init(fibn_2);
  mpz_init(fibn);

  mpz_set_ui(sum, 0UL);
  mpz_set_ui(fibn_2, 1UL);
  mpz_set_ui(fibn_1, 1UL);

  do {
    mpz_add(fibn, fibn_1, fibn_2);

    if (mpz_even_p(fibn) != 0) {
      mpz_add(sum, sum, fibn);
    }

    mpz_set(fibn_2, fibn_1);
    mpz_set(fibn_1, fibn);
  } while (mpz_cmp_ui(fibn, 4000000UL) < 0);

  printf("sum is: ");
  mpz_out_str(stdout, 10, sum);
  printf("\n");
}
